import router from "./router";
import { ElMessage } from "element-plus";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import { getToken, setToken, getUserId, setUserId } from "@/utils/auth";
import { getloginToken } from "@/api/login";
import { isRelogin } from "@/utils/request";
import useUserStore from "@/store/modules/user";
import useSettingsStore from "@/store/modules/settings";
import usePermissionStore from "@/store/modules/permission";

NProgress.configure({ showSpinner: false });

// 路由白名单，不需要登录就能访问
const whiteList = ["/login", "/auth-redirect", "/bind", "/register"];
// 路由前置守卫
router.beforeEach(async (to, from, next) => {
  NProgress.start();
  // 若地址带有登录票据，则通过票据获取token
  if (to.query.cssSsoTicket) {
    const cssSsoTicket = to.query.cssSsoTicket;
    await getloginToken(cssSsoTicket).then((res) => {
      console.log(res.token);
      if (res.code == 200) {
        setToken(res.token);
        setUserId(res.userId);
      }
    });
  }
  // 判断有token则获取用户信息
  const Token = getToken();
  if (Token) {
    to.meta.title && useSettingsStore().setTitle(to.meta.title);
    if (useUserStore().roles.length === 0) {
      isRelogin.show = true;
      // 判断当前用户是否已拉取完user_info信息
      await useUserStore().getInfo(getUserId()).then(async () => {
        isRelogin.show = false;
        await usePermissionStore().generateRoutes(getUserId()).then(async (accessRoutes) => {
          // hack方法 确保addRoutes已完成
          next({ ...to, replace: true });
        });
      }).catch((err) => {
        // 校验登录状态，若未登录则跳转登录页
        checkLoginStatus();
        // 退出登录
        // loginOut();
        next(); //放行
      });
    } else {
      next(); //放行
    }
  } else {
    // 不在白名单中
    if (whiteList.indexOf(to.path) == -1) {
      // 校验登录状态，若未登录则跳转登录页
      checkLoginStatus();
      // next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
      NProgress.done();
    }
    next(); //放行
  }
});
// 路由后置守卫
router.afterEach((to, from) => {
  NProgress.done();
});

// 校验登录状态，若未登录则跳转登录页
function checkLoginStatus() {
  const env = import.meta.env.VITE_APP_ENV;
  // 开发环境前端校验登录状态，其它环境通过后端校验登录状态
  if (env == "development") {
    // 跳转单点登录页并检测是否登录
    location.href = import.meta.env.VITE_APP_SSO_SERVE + '/sso/quit.action?toUrl=' + location.href;
  } else {
    // 跳转登录页面，通过后端校验实现跳转
    location.href = import.meta.env.VITE_APP_API_SERVE + import.meta.env.VITE_APP_BASE_API;
  }
}

// 退出登录
function loginOut() {
  useUserStore().logOut().then((res) => {
    ElMessage.error(err);
    console.log(res);
    location.href = res.retUrl;
  })
}